/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package terrforming.space.objects;

import com.sun.org.apache.bcel.internal.generic.INSTANCEOF;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * Вселенная
 * Содержит в себе ссылки на все объекты системы и все константы.
 * !!Данная реализация синглтона может некорректно работать в многопоточной среде!
 */
public final class Universe {
    
    /**Instance*/
    private static Universe instance;
    
    /** Гравитационная постоянная */
    public static final double G = 6.7*10E-20;
    
    /** Коэффициент преобразования дистанции
     * 180 млн. км. - орбита земли + запас = расстоянию от центра до верхнего края экрана
     * M = 180000000
     */
    public static final double M = 1.8E8;
        
    /** Космическая пыль (CosmicDust)*/
    private ArrayList<CosmicDust> cd;
    
    /** Космические объекты (CosmicObjects)*/
    private ArrayList<CosmicObject> objects;
    
    /**  Сингулярность (наш курсор)*/
    private Singularity sglrt;
    
    private Universe(){
        cd = new ArrayList<>();
        objects = new ArrayList();
        sglrt = new Singularity();
    }
    
    public static Universe getInstance(){
        if (instance==null){
            instance=new Universe();
        }
        return instance;
    }
    
    /**Преобразование километров в экранные координаты*/
    public static float convertDistance(float dist){
        return 0.000000011f*dist;
    }

    //Геттеры и сеттеры
    /** возвращает ссылку на массив пыли */
    public ArrayList<CosmicDust> getCd() {
        return cd;
    }

    public void setCd(ArrayList<CosmicDust> cd) {
        this.cd = cd;
    }

    /** возвращает ссылку на массив космических объектов*/
    public ArrayList<CosmicObject> getObjects() {
        return objects;
    }

    public void setObjects(ArrayList<CosmicObject> objects) {
        this.objects = objects;
    }

    /** возвращает ссылку на сингулярность*/
    public Singularity getSglrt() {
        return sglrt;
    }

    public void setSglrt(Singularity sglrt) {
        this.sglrt = sglrt;
    }
    
    //пересчитать состояние вселенной
    public void recalculate(){
        for (Iterator i=cd.iterator();i.hasNext();){
            CosmicDust cdt = (CosmicDust)i.next();
            if (cdt.isRemoved()){
                i.remove();
            } else {
                cdt.recalculate();
            }  
        }
        for (Iterator i=objects.iterator();i.hasNext();){
            CosmicObject co = ((CosmicObject)i.next());
            if (co.isRemoved()){
                i.remove();
            } else {
                co.recalculate();
            }  
        }
    }
    
    /**Очистить вселенную*/
    public void clear(){
        cd.clear();
        objects.clear();
    }
     
}
